<?php
namespace App\Config;

class Loader
{
    /**
     * 类名映射
     * @var array
     */
    public static $map = [];
    /**
     * 加载框架流程一系列处理类集合
     *
     * @var array
     */
    private static $handleList = [];
    /**
     * 类命名空间映射
     * @var array
     */
    public static $namespaceMap = [];

    /**
     * 注册应用命名空间
     *
     * @param Bootstrap $bootstrap
     */
    public static function register (Bootstrap $bootstrap)
    {
        //
        self::$namespaceMap = [
            'App' => APP_PATH
        ];
        //注册框架加载函数，不使用composer加载机制加载框架
        spl_autoload_register([ 'APP\Config\Loader', 'autoload' ]);
    }

    /**
     * 自动加载函数
     *
     * @param $class
     *
     * @throws \Exception
     */
    private static function autoload ($class)
    {
        $classOrigin = $class;
        $classInfo   = explode('\\', $class);
        $className   = array_pop($classInfo);
        foreach ($classInfo as &$v)
        {
            $v = strtolower($v);
        }
        unset($v);
        array_push($classInfo, $className);
        $class     = implode('\\', $classInfo);
        $path      = self::$namespaceMap['App'];
        $classPath = $path . '/' . str_replace('\\', '/' . '.php', $class) . '.php';
        if (!file_exists($classPath))
        {
            //框架记载文件不存在，composer加载
            throw new \Exception('类' . $classPath . '文件不存在', 404);
        }
        self::$map[$classOrigin] = $classPath;
        require $classPath;
    }

    /**
     * 注册一系列处理类
     *
     * @param \Closure $handle
     */
    public function load (\Closure $handle)
    {
        self::$handleList[] = $handle;
    }

    /**
     * 获取处理类
     *
     * @return array
     */
    public function getHandles ()
    {
        return self::$handleList;
    }

}